package com.jms.web.mvc.creator;

import com.jms.framework.beans.annotation.Component;
import com.jms.web.mvc.annotaion.RequestParam;
import com.jms.web.mvc.resolver.ParamTypeConverter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Parameter;
import java.util.Objects;

/**
 * RequestParam参数创建器类
 * 用于从HTTP请求中创建@RequestParam注解标记的参数值
 */
@Component
public class RequestParamArgumentCreator extends ArgumentCreator {


    /**
     * 构造函数，初始化参数创建器的优先级为19999
     * 并注册基本数据类型及其包装类、常用类型的字符串转换器
     */
    public RequestParamArgumentCreator() {
        super(19999);
    }

    /**
     * 创建参数值的方法
     * 根据@RequestParam注解或参数名称从HTTP请求中获取对应的参数值
     *
     * @param request HTTP请求对象，用于获取请求参数
     * @param response HTTP响应对象
     * @param parameter 方法参数对象，包含参数的注解和名称信息
     * @return 从请求中获取的参数值，如果参数不存在则返回null
     */
    @Override
    public Object create(HttpServletRequest request, HttpServletResponse response, Parameter parameter, Object handler) {
        // 检查参数是否包含RequestParam注解
        if (parameter.isAnnotationPresent(RequestParam.class)) {
            RequestParam requestParam = parameter.getAnnotation(RequestParam.class);
            String parameterName = requestParam.value();
            boolean required = requestParam.required();
            // 如果注解中未指定参数名称，则使用方法参数名称
            return ParamTypeConverter.convert(parameter.getType(), required ? Objects.requireNonNull(request.getParameter(parameterName)) : request.getParameter(parameterName));
        }
        // 如果没有RequestParam注解，直接使用参数名称获取请求参数
        return ParamTypeConverter.convert(parameter.getType(), request.getParameter(parameter.getName()));
    }
}
